/**
 *	@file	onlyone_poke.c
 *	@brief	個体識別するポケモンのチェック(常駐)
 *	@author	miyuki iwasawa
 */

#include "common.h"
#include "system/arc_util.h"
#include "include/msgdata/msg_fld_trade.h"
#include "include/msgdata/msg.naix"
#include "include/gflib/strbuf_family.h"
#include "fieldsys.h"
#include "field_event.h"
#include "ev_mapchange.h"
#include "ev_time.h"
#include "savedata/zukanwork.h"
#include "savedata/get_poke.h"
#include "savedata/mail.h"
#include "savedata/mail_util.h"
#include "savedata/misc.h"
#include "poketool/poke_memo.h"
#include "poketool/monsno.h"
#include "itemtool/itemsym.h"
#include "zonedata.h"

#include "field_trade.h"
#include "field_trade_local.h"
#include "onlyone_poke.h"

static BOOL sub_KeepPokeCheck( POKEMON_PARAM* pp, FLD_TRADE_POKEDATA* p_data,u32 trade_no );

//----------------------------------------------------------------------------
/**
 *	@brief	預かったポケモンかどうかチェックする
 *
 *	@param	pp		ポケモンパラム
 *	@param	trade_no	tradeナンバー
 */
//-----------------------------------------------------------------------------
BOOL OnlyonePoke_KeepPokeCheck( POKEMON_PARAM* pp,u32 trade_no )
{
	BOOL ret;
	FLD_TRADE_POKEDATA* p_data;

	// 交換データ読み込み
	p_data = ArcUtil_Load( ARC_FIELD_TRADE_POKE, trade_no, FALSE, HEAPID_WORLD, ALLOC_BOTTOM );
	ret = sub_KeepPokeCheck( pp,p_data,trade_no );
	sys_FreeMemoryEz(p_data);

	if(ret){
		return TRUE;
	}
	return FALSE;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ウツギのトゲピーかどうかチェックする
 *
 *	@param	pp		ポケモンパラム
 *	@param	trade_no	tradeナンバー
 */
//-----------------------------------------------------------------------------
BOOL OnlyonePoke_UtsugiTogepiiCheck( POKEMON_PARAM* pp ,SAVEDATA* save)
{
	u32 param32;
	u16 param16;
	u8	param8;
    MYSTATUS* my = SaveData_GetMyStatus(save);
    MISC* misc = SaveData_GetMisc(save);

	//モンスターナンバーチェック
	param16 = PokeParaGet(pp,ID_PARA_monsno,NULL);
	if( param16 != MONSNO_TOGEPII && param16 != MONSNO_TOGETIKKU && param16 != MONSNO_TOGEON){
		return FALSE;
	}

	//トレーナーIDチェック
	param32 = PokeParaGet(pp,ID_PARA_id_no,NULL);
	if(param32 != MyStatus_GetID(my)){
		return FALSE;
	}
	// 親の性別
	param8 = PokeParaGet( pp, ID_PARA_oyasex, NULL );
	if(param8 != MyStatus_GetMySex(my)){
		return FALSE;
	}
	// 国コード
	param8 = PokeParaGet( pp, ID_PARA_country_code, NULL );
	if(param8 != CasetteLanguage){
		return FALSE;
	}
	//カセットコード
	param8 = PokeParaGet( pp, ID_PARA_get_cassette,NULL );
	if(param8 != CasetteVersion){
		return FALSE;
	}

	//個性乱数と性別取得
	MISC_GetUtsugiTogepiiParam(misc, &param32, &param8);

	//個性乱数チェック
	if(param32 != PokeParaGet(pp,ID_PARA_personal_rnd,NULL)){
		return FALSE;
	}
	//性別チェック
	if(param8 != PokeParaGet( pp, ID_PARA_sex, NULL )){
		return FALSE;
	}
	return TRUE;
}

//----------------------------------------------------------------------------
/**
 *	@brief	預かったポケモンかどうかチェックするサブ関数
 *
 *	@param	pp		ポケモンパラム
 *	@param	p_data		データ
 *	@param	trade_no	tradeナンバー
 *	@param	heapID		heapID
 */
//-----------------------------------------------------------------------------
static BOOL sub_KeepPokeCheck( POKEMON_PARAM* pp, FLD_TRADE_POKEDATA* p_data,u32 trade_no )
{
	u32 param32;
	u16 param16;
	u8	param8;
	MSGDATA_MANAGER* msg_data;

	//モンスターナンバーチェック
	param16 = PokeParaGet(pp,ID_PARA_monsno,NULL);
	//オニスズメは進化するかも
	if(trade_no == FLD_TRADE_ONISUZUME){
		if( param16 != MONSNO_ONISUZUME && param16 != MONSNO_ONIDORIRU ){
			return FALSE;
		}
	}else if(param16 != p_data->monsno){
		return FALSE;
	}

	//トレーナーIDチェック
	param32 = PokeParaGet(pp,ID_PARA_id_no,NULL);
	if(param32 != p_data->mons_id){
		return FALSE;
	}

	//個性乱数チェック
	param32 = PokeParaGet(pp,ID_PARA_personal_rnd,NULL);
	if(param32 != p_data->mons_rnd){
		return FALSE;
	}

	// 親の性別
	param8 = PokeParaGet( pp, ID_PARA_oyasex, NULL );
	if(param8 != p_data->oya_sex){
		return FALSE;
	}

	// 国コード
	param8 = PokeParaGet( pp, ID_PARA_country_code, NULL );
	if(param8 != p_data->world_code){
		return FALSE;
	}

	//カセットコード
	param8 = PokeParaGet( pp, ID_PARA_get_cassette,NULL );
	if(param8 != CasetteVersion){
		return FALSE;
	}
	msg_data = MSGMAN_Create(MSGMAN_TYPE_NORMAL, ARC_MSG, NARC_msg_fld_trade_dat, HEAPID_WORLD);

	//ニックネームチェック
	{
		STRBUF* o_str,*p_str;
		BOOL ret;

		p_str = STRBUF_Create(BUFLEN_POKEMON_NAME,HEAPID_WORLD);
		PokeParaGet( pp, ID_PARA_nickname_buf, p_str );

		o_str = MSGMAN_AllocString(msg_data, FLD_TRADE_GET_POKE_GMM(trade_no));

		//比較
		ret = STRBUF_Compare(p_str,o_str);
		STRBUF_Delete(o_str);
		STRBUF_Delete(p_str);

		if(ret){
#if GS_BTS5556_20090714_FIX
			MSGMAN_Delete(msg_data);
#endif
			return FALSE;
		}
	}
	//親名チェック
	{
		STRBUF* o_str,*p_str;
		BOOL ret;

		p_str = STRBUF_Create(BUFLEN_PERSON_NAME,HEAPID_WORLD);
		PokeParaGet( pp, ID_PARA_oyaname_buf, p_str );

		o_str = MSGMAN_AllocString(msg_data, FLD_TRADE_GET_OYA_GMM(trade_no));

		//比較
		ret = STRBUF_Compare(p_str,o_str);
		STRBUF_Delete(o_str);
		STRBUF_Delete(p_str);

		if(ret){
#if GS_BTS5556_20090714_FIX
			MSGMAN_Delete(msg_data);
#endif
			return FALSE;
		}
	}
	MSGMAN_Delete(msg_data);
	return TRUE;
}
